/**
 * @file PageDeriver.cpp
 * @author your name (you@domain.com)
 * @brief 这个文件应该有各种宏定义来自动生成的类，这里书写的原因时
 * 要进一步探究如何定义这个宏来生成用户想要的类
 * 通过json文件来生成这个.cpp文件。然后再去执行编译
 * @version 0.1
 * @date 2023-03-02
 * 
 * @copyright Copyright (c) 2023
 * 
 */
#include "PageBase.h"
#include "MessageBus.h"
#include "PageUsr.h"
#include "ClassObjectPool.h"

#define CLASSHEAD(CLASSNAME) \
class Page##CLASSNAME: public PageBase {\
public:\
    void MsgProc() {\
		ClassObjectPool obj;\
		std::shared_ptr<PageUsr> msgProcCls = obj.Get<PageUsr>(GetPageName());\
        msgProcCls->MsgProc();\
    }\
\
    void UpData() {\
		ClassObjectPool obj;\
		std::shared_ptr<PageUsr> msgProcCls = obj.Get<PageUsr>(GetPageName());\
        msgProcCls->UpData();    \
    }\

#define CLASSBODY(CLASSNAME) \
Page##CLASSNAME(const int x, const int y, const int width, const int height)\
:PageBase()\
{\

#define CLASSTAIL\
    MessageBus bus;\
    bus.Attach([this]() {\
        MsgProc();\
    }, "GUI");\
    bus.Attach([this]() {\
        UpData();\
    }, "STATUS");\
}\

class PageA: public PageBase {
public:
    void MsgProc() {
		ClassObjectPool obj;
		std::shared_ptr<PageUsr> msgProcCls = obj.Get<PageUsr>(GetPageName());
        msgProcCls->MsgProc();
    }

    //NOTE 页面状态的变更接口函数必须由子类实现,入参待定...
    void UpData() {
		ClassObjectPool obj;
		std::shared_ptr<PageUsr> msgProcCls = obj.Get<PageUsr>(GetPageName());
        msgProcCls->UpData();    
    }

    PageA(const int x, const int y, const int width, const int height)
    :PageBase() 
    {
        //NOTE 这里要依据json去生成这个类的成员变量
        MessageBus bus;
        bus.Attach([this]() {
            MsgProc();
        }, "GUI");
        bus.Attach([this]() {
            UpData();
        }, "STATUS");
    }
};
Json::Value config = Json::nullValue;
//NOTE GUI对象全部放在静态区里面
static PageA pageA(config); 
//NOTE 以上代码就是通过宏定义来实现的，用户只需要继承PageUsr类实现子类，并在生成一个static子类对象将该对象放到ClassObjectPool中。